Logotipo do IFSC Logotipo do DACC Logotipo do Curso de Geoprocessamento Logotipo da disciplina PAG014903

Fundamentos de Programação em Python

v0.0.1

Padrão

Capítulo 7 · Do Endereço ao Mapa — Geocodificação com Geopy

Aprenda a transformar endereços em coordenadas, automatizar buscas em lote e preparar bases espaciais prontas para análise ou visualização.

Você vai aprender a

  • Explicar o conceito de geocodificação e suas aplicações no geoprocessamento.
  • Configurar o Geopy para consumir provedores confiáveis, como o ArcGIS.
  • Geocodificar endereços individuais ou em lote e gerar planilhas com coordenadas.

1. O que é geocodificação? Transformando texto em localização

Endereços como "Avenida Mauro Ramos, 950" ou "Praça XV de Novembro" são intuitivos para nós, mas computadores trabalham melhor com números. A geocodificação converte descrições textuais em pares de coordenadas (latitude e longitude), permitindo que sistemas GIS posicionem um pino no mapa.

O processo inverso recebe o nome de geocodificação reversa: dado um par de coordenadas, obtemos o endereço correspondente. Ambas as direções sustentam análises espaciais modernas e integram planilhas a mapas.

Por que isso é crucial no geoprocessamento?

  • Enriquecimento de dados: planilhas com endereços passam a conter coordenadas, desbloqueando análises espaciais.
  • Análises avançadas: cálculos de distância, identificação de clusters e criação de mapas de calor dependem de pontos georreferenciados.
  • Aplicações modernas: logística, transporte e marketing baseiam-se em geocodificação para localizar clientes, criar rotas e definir áreas de influência.

2. Como funciona? APIs e a biblioteca Geopy

Construir um geocodificador do zero exigiria um banco global de endereços — tarefa reservada às grandes empresas. Felizmente, APIs prontas (Google, Here, TomTom, Esri) disponibilizam infraestrutura robusta mediante requisições HTTP.

A biblioteca Geopy atua como um tradutor universal. Você usa métodos padronizados como .geocode(), e ela cuida de adaptar a chamada para o serviço escolhido. Trocar de provedor costuma ser tan-to simples quanto alterar uma linha de código.

Dica do professor

Para projetos acadêmicos, o provedor ArcGIS equilibra qualidade e facilidade: não exige chave de API para uso básico e aceita um volume moderado de requisições.

Curiosidade: limites de uso

Serviços como o Nominatim, baseado no OpenStreetMap, limitam o ritmo de requisições (tipicamente 1 por segundo) para evitar sobrecarga. Respeitar limites é parte da boa cidadania digital.

3. Mãos à obra: geocodificando seu primeiro endereço

Vamos localizar o IFSC Florianópolis com o provedor ArcGIS. Instale o Geopy no ambiente virtual do projeto:

pip install geopy

O script abaixo organiza o fluxo em quatro etapas: importar, instanciar, geocodificar e validar o retorno.

# 1. Importar a classe do provedor escolhido
from geopy.geocoders import ArcGIS

# 2. Criar o geocodificador (nosso "controle remoto")
geolocator = ArcGIS()

# 3. Enviar o endereço para a API
endereco = "IFSC Florianópolis, Avenida Mauro Ramos, 950, Centro, Florianópolis, SC"
print(f"Buscando as coordenadas para: '{endereco}'")

try:
    location = geolocator.geocode(endereco, timeout=10)

    # 4. Conferir se o resultado é válido
    if location:
        print(f"\nEndereço completo encontrado: {location.address}")
        print(f"Latitude: {location.latitude}")
        print(f"Longitude: {location.longitude}")
        print(f"Coordenadas: ({location.latitude}, {location.longitude})")
        # print(f"Dados brutos: {location.raw}")
    else:
        print("\nEndereço não encontrado ou ambíguo. Tente detalhar mais.")

except Exception as e:
    print(f"\nOcorreu um erro durante a geocodificação: {e}")

Atenção aos resultados

Se location for None, o endereço não foi encontrado. Sempre valide antes de acessar location.latitude para evitar erros AttributeError.

4. Laboratório prático: geocodificando uma lista de escolas

Agora, aplicamos o conceito em lote. Se você já tem o arquivo arquivos/NEIM.txt da rede municipal de Florianópolis (disponível neste material), basta reutilizá-lo para gerar a lista simplificada de endereços. Utilize o botão abaixo para baixar o arquivo original direto para o seu computador.

Arquivo de referência

Coleção completa dos NEIMs de Florianópolis com nome, endereço, CEP, contato e direção.

Baixar NEIM.txt

O fragmento abaixo cria automaticamente um enderecos.txt com apenas o nome da unidade e o endereço completo separados por ponto e vírgula.

import pandas as pd
from pathlib import Path

fonte = Path('arquivos/NEIM.txt')
destino = Path('enderecos.txt')

df = pd.read_csv(fonte, sep=';', encoding='utf-8')

df[['Nome', 'Endereço']].to_csv(destino, sep=';', index=False, header=False)

print(f"Arquivo '{destino}' criado com {len(df)} endereços.")

Se preferir manter tudo em um único arquivo, também é possível adaptar o script principal para ler diretamente o NEIM.txt; a versão abaixo mostra a abordagem com o arquivo reduzido enderecos.txt, ideal para focar nos campos essenciais.

Com o arquivo de endereços pronto, confirme que cada linha possui o formato nome;endereço:

NEIM Abraão;Rua João Meirelles, n° 1780 - Abraão, Florianópolis
NEIM Anjo da Guarda;Rua João da Cruz Meira, n° 350 - Trindade, Florianópolis
NEIM Campeche;Servidão Dionísio Rafhael Ignácio, n° 287 - Campeche, Florianópolis
NEIM Coqueiros;Rua Bento Góia, n° 185 - Coqueiros, Florianópolis
NEIM Ingleses I;Rua Três Maria, n° 1040 - Ingleses, Florianópolis
Lugar Inválido;Rua Inexistente, 9999, Bairro Fantasma, Cidade Nenhuma

O script a seguir lê cada linha, chama a API, respeita limites de uso e salva um CSV estruturado:

import pandas as pd
from geopy.geocoders import ArcGIS
import time

# --- 1. Configuração ---
geolocator = ArcGIS()
arquivo_entrada = 'enderecos.txt'
arquivo_saida = 'escolas_geocodificadas.csv'
resultados_geocodificados = []

print(f"Iniciando a geocodificação do arquivo '{arquivo_entrada}'...")

try:
    with open(arquivo_entrada, 'r', encoding='utf-8') as f:
        for linha in f:
            if not linha.strip():
                continue

            partes = linha.strip().split(';')
            if len(partes) != 2:
                print(f"  - AVISO: Linha mal formatada, pulando: '{linha.strip()}'")
                continue

            nome_escola, endereco_para_buscar = partes
            print(f"  - Geocodificando: {nome_escola}...")

            try:
                location = geolocator.geocode(endereco_para_buscar, timeout=10)

                if location:
                    resultados_geocodificados.append({
                        'nome_escola': nome_escola,
                        'endereco_encontrado': location.address,
                        'latitude': location.latitude,
                        'longitude': location.longitude
                    })
                else:
                    print(f"    AVISO: Endereço para '{nome_escola}' não encontrado.")
                    resultados_geocodificados.append({
                        'nome_escola': nome_escola,
                        'endereco_encontrado': 'NÃO ENCONTRADO',
                        'latitude': None,
                        'longitude': None
                    })

            except Exception as e:
                print(f"    ERRO ao geocodificar '{nome_escola}': {e}")

            time.sleep(1)  # Respeito ao rate limit

except FileNotFoundError:
    print(f"ERRO CRÍTICO: O arquivo '{arquivo_entrada}' não foi encontrado.")
except Exception as e:
    print(f"Ocorreu um erro inesperado: {e}")

if resultados_geocodificados:
    df_resultados = pd.DataFrame(resultados_geocodificados)
    df_resultados.to_csv(arquivo_saida, index=False, encoding='utf-8-sig')
    print(f"\nGeocodificação concluída! Resultados salvos em '{arquivo_saida}'.")
else:
    print("\nNenhum endereço foi processado.")

O arquivo escolas_geocodificadas.csv gerado contém coordenadas prontas para o QGIS, Folium ou quaisquer análises espaciais subsequentes.

Exercício rápido

  1. Personalize a lista: inclua três endereços relevantes para seus projetos e avalie a precisão das coordenadas.
  2. Valide resultados: abra o CSV no QGIS e confirme se os pontos coincidem com os locais esperados.
  3. Experimente outro provedor: troque ArcGIS() por Nominatim(user_agent="ifsc-geopy") e compare diferenças.

5. Conclusão e próximos passos

Você aprendeu a transformar textos em coordenadas, tratar erros de geocodificação e gerar outputs compatíveis com ferramentas de análise espacial. No próximo capítulo, integraremos esses dados a mapas interativos.